Métodos Jerárquicos

No Supervisado - Práctica

Primavera 2022

USA Arrest


Utilizaremos el dataset USAarrst de la libreria cluster. Este conjunto de datos contiene estadísticas, de arrestos por cada 100,000 habitantes por asalto, asesinato y violación en cada uno de los 50 estados de EE. UU. En 1973. También se da el porcentaje de la población que vive en áreas urbanas.

Features

Las columnas del datasets:

  • Murder: arrestos por asesinatos por cada 100,000 hab.

  • Assault: arrestos por asaltos por cada 100,000 hab.

  • UrbanPop: porcentaje de población urbana.

  • Rape: arrestos por violacón por cada 100,000 hab.

Veremos diferencias entre los métodos jerárquicos que vimos en la teórica y tratar de agrupar estados que tengan comportamientos similares.

Librerias


library(cluster)
library(dendextend)
library(ggplot2)
library(factoextra)
library(repr)

Datos


data("USArrests")
df = USArrests
head(df, n=7)
            Murder Assault UrbanPop Rape
Alabama       13.2     236       58 21.2
Alaska        10.0     263       48 44.5
Arizona        8.1     294       80 31.0
Arkansas       8.8     190       50 19.5
California     9.0     276       91 40.6
Colorado       7.9     204       78 38.7
Connecticut    3.3     110       77 11.1

Cuidado con la escala


Sin Escalar

d = dist(df) # Calculamos la matriz de distancias
arrest_hclust1 = hclust(d, method="single")
fviz_dend(arrest_hclust1, cex=1)

Escalado

df_stand = scale(df) # estandarizamos

d_stand = dist(df_stand)
arrest_hclust2 = hclust(d_stand, method="single")
fviz_dend(arrest_hclust2, cex=1)

Comparamos

Tanglegram

Tanglegram


# Creamos los dendrogramas
dend1 = as.dendrogram(arrest_hclust1)
dend2 = as.dendrogram(arrest_hclust2)

# Los juntamos en una lista
dend_list = dendlist(dend1, dend2)

# Alineamos los mejor posible los dendrogramas
dendlist(dend1, dend2) %>%
    untangle(method = "step1side") %>% # Busca la mejor alineación
    tanglegram() # Dibuja 

Alineación


# Calculamos una medida de alineamiento entre los dendrogramas
dendlist(dend1, dend2) %>% 
    untangle(method = "step1side") %>% # 
    entanglement()                     # valor entre 0 y 1. Cuanto más cerca de 1 menos alineados.
[1] 0.3545231


# Lo mismo sin la alineación
dendlist(dend1, dend2) %>% 
    entanglement() 
[1] 0.5052159

Correlación entre Árboles


# Correlación entre los árboles
dend_list = dendlist(dend1, dend2) 

# Cophenetic correlation
cor.dendlist(dend_list, method = "cophenetic")
          [,1]      [,2]
[1,] 1.0000000 0.4104309
[2,] 0.4104309 1.0000000
# Baker correlation
cor.dendlist(dend_list, method = "baker")
          [,1]      [,2]
[1,] 1.0000000 0.6343639
[2,] 0.6343639 1.0000000

Volviendo

### Ya nos convencimos que hay que estandarizar
### Analicemos los resultados que nos hubiesen dado distintos métodos

# Create multiple dendrograms by chaining
dend1 <- df_stand %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df_stand %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df_stand %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df_stand %>% dist %>% hclust("centroid") %>% as.dendrogram
dend5 <- df_stand %>% dist %>% hclust("ward.D") %>% as.dendrogram
dend6 <- df_stand %>% dist %>% hclust("ward.D2") %>% as.dendrogram

Volviendo

 

# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
                      "Average" = dend3, "Centroid" = dend4, "Ward"=dend5, "Ward2"=dend6)
cors <- cor.dendlist(dend_list, method="baker")

# Print correlation matrix
round(cors, 2)
         Complete Single Average Centroid Ward Ward2
Complete     1.00   0.63    0.89     0.21 0.94  0.95
Single       0.63   1.00    0.63     0.01 0.53  0.53
Average      0.89   0.63    1.00     0.25 0.84  0.84
Centroid     0.21   0.01    0.25     1.00 0.29  0.29
Ward         0.94   0.53    0.84     0.29 1.00  0.99
Ward2        0.95   0.53    0.84     0.29 0.99  1.00

Visualización

library(corrplot)

par(mfrow=c(1,2))
corrplot(cors, "number", "lower", tl.cex=1.5, number.cex=1.5)
corrplot(cors, "ellipse", "lower", tl.cex=1.5)

Visualización

Complete

Corte K=2

Corte K=4

Etiquetas

complete_hclust = hclust(dist(df_stand), method="complete")
complete_clusters = cutree(complete_hclust, k=4)
complete_clusters
       Alabama         Alaska        Arizona       Arkansas     California 
             1              1              2              3              2 
      Colorado    Connecticut       Delaware        Florida        Georgia 
             2              3              3              2              1 
        Hawaii          Idaho       Illinois        Indiana           Iowa 
             3              4              2              3              4 
        Kansas       Kentucky      Louisiana          Maine       Maryland 
             3              3              1              4              2 
 Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
             3              2              3              1              3 
       Montana       Nebraska         Nevada  New Hampshire     New Jersey 
             4              4              2              4              3 
    New Mexico       New York North Carolina   North Dakota           Ohio 
             2              2              1              4              3 
      Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
             3              3              3              3              1 
  South Dakota      Tennessee          Texas           Utah        Vermont 
             4              1              2              3              4 
      Virginia     Washington  West Virginia      Wisconsin        Wyoming 
             3              3              4              3              3 

Análisis

Externo

Ejercicios

  1. Calcular a mano los métodos single y average para el siguiente conjunto de puntos: \[ D = \{ (1,2),(2,3.4),(1.1,7),(−2,−0.5),(2.2,5),(3.2,3.1),(−1,−1) \}.\]

  2. Utilizar otro algoritmo jerárquico aglomerativo para el conjunto de datos USArrest. Luego, descartar la variable UrbanPop y repetir el análisis.

  3. Utilizar un método de cluster jerárquico para el conjunto de datos “Mall_Costumers.csv”. Las descripción de las variables la puede encontrar en Kaggle. Probar el método divisivo Daisy.